package ewelinkapi

import (
	"context"
	"fmt"

	"gitee.com/libs_2/ewelinkapi/cache"
	"gitee.com/libs_2/ewelinkapi/model"
	"github.com/gorilla/websocket"
)

type Client struct {
	domain         string
	dispatchDomain string
	appId          string
	secret         string
	autoToken      bool
	tmpToken       string
	hackMode       bool
	cache          cache.Cache
	accountReq     model.AccountLoginRequest
	socket         struct {
		connected   bool
		autoConnect bool
		conn        *websocket.Conn
		config      model.SocketConfig
	}

	onDeviceOnlineChanges      []OnDeviceOnlineStateChange
	onDeviceOutlet4UpdateState []OnDeviceUpdateState
	onConnectionClose          OnConnectionClose
}

// 创建一个易微联的客户端，推荐一起调用 SetAutoToken 方便处理token
func NewClient(domain, dispatchDomain, appId, secret string, cache cache.Cache) *Client {
	return &Client{
		domain:         domain,
		dispatchDomain: dispatchDomain,
		appId:          appId,
		secret:         secret,
		cache:          cache,
	}
}

// 设置是否自动处理token
//
// 如果设置为自动，则会在从缓存中获取access_token失败时，自动尝试调用refresh_token来更新缓存，
// 如果更新缓存失败，则尝试重新登录，成功后会放入缓存
func (c *Client) SetAutoToken(flag bool, opt Option) {
	c.autoToken = flag
	opt(c)
}

// 设置为hack模式，会自动刷新一次令牌
//
//	hack模式下，刷新令牌的appId需要跟c 的appId一致，且刷新令牌会使用accessToken来先调用一次刷新令牌处理
//	令牌参数仅支持使用一次，改方法仅为测试用
func (c *Client) RunAtHackMode(ctx context.Context, accessToken, refreshToken string) error {
	c.tmpToken = accessToken
	res, err := c.refreshTokenWithHack(ctx, refreshToken)
	if err != nil {
		return err
	}

	fmt.Printf("%+v", res)

	c.tmpToken = ""
	c.hackMode = true
	return nil
}
